# python的方法可以返回一个方法
# 返回一个函数时，牢记该函数并未执行，返回函数中不要引用任何可能会变化的变量


def lazy_sum(*args):
    def my_sum():
        ax = 0
        for x in args:
            ax = ax + x
        return ax

    return my_sum


f = lazy_sum(1, 3, 5, 7)
print(f)
print(f())

# 调用lazy_sum()时，每次调用都会返回一个新的函数，即使传入相同的参数
f2 = lazy_sum(1, 3, 5, 6)
print(f == f2)


# 返回函数不要引用任何循环变量，或者后续会发生变化的变量


def my_count():
    fs = []
    for i in range(1, 4):
        def fn():
            return i * i

        fs.append(fn)
    return fs


f3, f4, f5 = my_count()
print(f3())
print(f4())
print(f5())


# 如果一定要引用循环变量怎么办？方法是再创建一个函数，用该函数的参数绑定循环变量当前的值，
# 无论该循环变量后续如何更改，已绑定到函数参数的值不变


def count_2():
    def f(j):
        def g():
            return j * j

        return g

    fs = []
    for i in range(1, 4):
        fs.append(f(i))
    return fs


f6, f7, f8 = count_2()
print(f6())
print(f7())
print(f8())
